package rede.treinamento;
import static jogo.SimboloJogada.O;
import static jogo.SimboloJogada.X;
import static jogo.SimboloJogada._;
import jogo.Jogada;
import jogo.SimboloJogada;
import jogo.Tabuleiro;

public class CalculadorScore {
	
	public static final Double SCORE_MATCHPOINT = 1.0;
	public static final Double SCORE_DEFESA = 0.8;

	enum TipoJogada {
		AMEACADA, OCUPADO, MATCHPOINT, NORMAL;
	}

	public static Double[][] calculaScores(Tabuleiro tabuleiro, SimboloJogada simbolo) {
		Double[][] scores = new Double[3][3];
		TipoJogada[][] tipos = new TipoJogada[3][3];

		int contadorNormal = 0;
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (tabuleiro.isOcupado(i, j)) {
					tipos[i][j] = TipoJogada.OCUPADO;
				} else if (ameaca(tabuleiro, i, j, simbolo)) {
					tipos[i][j] = TipoJogada.AMEACADA;
				} else if (isMatchPoint(tabuleiro, i, j, simbolo)) {
					tipos[i][j] = TipoJogada.MATCHPOINT;
				} else {
					tipos[i][j] = TipoJogada.NORMAL;
					contadorNormal++;
				}
			}
		}
		
		double scoreNormal = contadorNormal == 0 ? 0.0 : (1.0 / contadorNormal);

		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (tipos[i][j] == TipoJogada.AMEACADA ) {
					scores[i][j] = SCORE_DEFESA;
				} else if (tipos[i][j] == TipoJogada.MATCHPOINT) {
					scores[i][j] = SCORE_MATCHPOINT;
				} else if (tipos[i][j] == TipoJogada.NORMAL) {
					scores[i][j] = scoreNormal;
				} else if (tipos[i][j] == TipoJogada.OCUPADO) {
					scores[i][j] = Double.NaN;
				} else {
					throw new RuntimeException("Isso eh bem alguma excecao em algum lugar do codigo...");
				}
			}
		}

		return scores;
	}

	private static boolean ameaca(Tabuleiro tabuleiro, int i, int j, SimboloJogada simbolo) {
		return tabuleiro.terminou(new Jogada(i, j, simbolo.contrario()));
	}

	private static boolean isMatchPoint(Tabuleiro tabuleiro, int i, int j, SimboloJogada simbolo) {
		return tabuleiro.terminou(new Jogada(i, j, simbolo));
	}

	@SuppressWarnings("unused")
	private static void printTipos(TipoJogada[][] tipos) {
		for (int i = 0; i < tipos.length; i++) {
			for (int j = 0; j < tipos[i].length; j++) {
				System.out.print(tipos[i][j].name() + "\t");
			}
			System.out.println();
		}
		System.out.println();
	}

	public static void main(String[] args) {
		Tabuleiro tab = new Tabuleiro();
		SimboloJogada[][] simbolos = { { O, _, X }, { _, O, _ }, { _, _, _ } };

		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				tab.setSimbolo(i, j, simbolos[i][j]);
			}
		}

		int i = 2;
		int j = 2;
		System.out.println(ameaca(tab, i, j, X));
		System.out.println(ameaca(tab, i, j, _));
		System.out.println(ameaca(tab, i, j, O));

	}
}
